home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 6
/
FM Towns Free Software Collection 6.iso
/
t_os
/
diskdup
/
option.c
< prev
next >
Wrap
Text File
|
1993-07-08
|
9KB
|
367 lines
/************************************************************
* *
* DISKDUP *
* *
* オンメモリ型 DISKCOPY *
* *
* OPTION.C *
* *
************************************************************/
/************************************************************
インクル-ドファイル
*************************************************************/
#define __OPT__
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <stat.h>
#include <string.h>
#include <memory.h>
#include "option.h"
#include "ddupgui.h"
#include "diskdup.h"
unsigned long pan;
/*char fname[256];*/
/*char DiskData[100000];*/
/*unsigned long dtlong;*/
/*char Headdata[32];*/
unsigned long dtlong;
/************************************************************
[オプション解析]
概要 オプションパラメ-タの解析を行い結果を返す
用法 optionset( argc, argv );
引数 int argc
char *argv[]
戻り値 0 オプション無し
-1 オプションの指定が正しくない
-2 ヘルプを表示
ビットが立っていない場合 / 立っている場合
bit 0 デ-タファイルをロ-ドしない/デ-タファイルをロ-ドする
1 デ-タファイルを作成しない/デ-タファイルを作成する
2* フォ-マットを選択する /フォ-マットをしない
3* フォ-マットを選択する /フォ-マットをする
4 入力を求める /エラ-時以外は入力を求めない
注意 bit2=0 && bit3=0 の時のみフォ-マットを選択する
************************************************************/
int optionset( int argc, char *argv[] )
{
int ret;
int count;
char c;
ret=0;
/* オプション パラメータ 解析 */
if ( argc > 1 )
{
for ( count = 1; count < argc; count++ ) /* パラメータ の数だけ ループ */ {
if ( ( ret != -1 ) && (ret != -2 ) )
{
c = *argv[count]; /* 先頭文字 get */
/* strcpy ( str, argv[count] );
putmessage();
ready();*/
if ( c == '/' || c == '-' ) /* 先頭文字は '/' or '-'*/
{
c = *(argv[count] + 1); /* 2 文字目 get */
switch ( c )
{
case 'h':
case 'H':
case '?':
ret = -2;
break;
case 'l':
case 'L':
flagld=1;
ret |= 1;
break;
case 's':
case 'S':
flagsv=1;
ret |= 2;
break;
case 'f':
case 'F':
flagfmt=2;
ret |=8;
break;
case 'd':
case 'D':
flagfmt=1;
ret |= 4;
break;
case 'i':
case 'I':
flagipt=1;
ret |=16;
break;
/* 無効 パラメータ */
default:
ret = -1;
} /* <switch> */
}
else
{
strcpy(fname, argv[count] );
/* strcpy( str, fname );
putmessage();*/
} /* <if ( c=='/' || c=='-' )> */
} /* <if (ret == -1 )> */
} /* <for> */
} /* <if (argc > 1 )> */
return ret;
}
/***************************************************************
[デ-タファイルを読み込む]
用法 loaddata();
引数 DiskData
戻り値 :0 成功
:-1 失敗
:1,2,3 diskのフォ-マットの種類
***************************************************************/
int loaddata ( char *Data )
{
int ret;
ret=0;
int rsize;
if (access(fname,0) !=0 )
{
flagerr=1;
strcpy( str, "デ-タファイルが見つかりません。" );
putmessage();
ready();
ret=-1;
flagerr=0;
}
else
{
pan=_open(fname,_O_BINARY | _O_RDWR );
if ( pan == -1 )
{
flagerr=1;
strcpy( str, "ファイルのオ-プンに失敗しました。" );
putmessage();
ready();
ret=-1;
flagerr=0;
}
rsize = _read(pan,Headdata,32);
if( rsize == -1 || rsize != 32 )
{
flagerr=1;
strcpy( str, "ヘッダの読み込みに失敗しました。" );
putmessage();
ready();
_close(pan);
ret=-1;
flagerr=0;
}
if( strncmp(Headdata,"DISKDUP ",8) !=0 )
{
flagerr=1;
strcpy( str, "DISKDUPのデ-タファイルではありません。" );
putmessage();
ready();
_close(pan);
ret=-1;
flagerr=0;
}
else
{
ret=gethead();
rsize = _read(pan,Data,dtlong);
if( rsize == -1 || rsize != dtlong || ret == -1 )
{
flagerr=1;
_close(pan);
strcpy( str, "デ-タファイルの読み込みに失敗しました。" );
putmessage();
ready();
ret=-1;
flagerr=0;
}
else
{
_close(pan);
}
}
}
return ret;
}
/***************************************************************
[デ-タファイルを作成する]
用法 savedata();
引数 無し
戻り値 :0 成功
:-1 失敗
***************************************************************/
int savedata ( char *Data )
{
int ret;
int wsize;
ret=0;
if (_access(fname,0) ==0 )
{
flagerr=1;
strcpy( str, "同名のファイルがあります。上書きして良いですか。" );
putmessage();
if ( select()==1 )
{
ret=-1;
}
}
flagerr=0;
if (ret == 0 )
{
pan=_open(fname,_O_BINARY | _O_RDWR | _O_CREAT, _S_IREAD | _S_IWRITE );
if (pan == -1 )
{
ret=-1;
}
if (ret == 0 )
{
makehead();
wsize = _write(pan,Headdata,32);
if( wsize ==-1 || wsize != 32 )
{
flagerr=1;
strcpy( str, "ヘッダの書き込みに失敗しました。" );
putmessage();
ready();
_close(pan);
ret=-1;
flagerr=0;
}
}
if (ret == 0 )
{
wsize = _write(pan,Data,dtlong);
if( wsize == -1 || wsize != dtlong )
{
flagerr=1;
strcpy( str, "デ-タの書き込みに失敗しました。" );
putmessage();
ready();
_close(pan);
_unlink(fname);
ret=-1;
flagerr=0;
}
else
{
_close(pan);
}
}
}
return ret;
}
/**********************************************************
[ヘッドデ-タを作る]
用法 makehead();
引数 無し
変化する変数 Headdata
**********************************************************/
void makehead ( void )
{
switch ( disktype )
{
case 1:
strncpy ( Headdata,"DISKDUP MFM 2HD 1024B/S 8S 154T ",32 );
dtlong=1261568;
break;
case 2:
strncpy ( Headdata,"DISKDUP MFM 2DD 720B/S 9S 160T ",32 );
dtlong=737280;
break;
case 3:
strncpy ( Headdata,"DISKDUP MFM 2DD 640B/S 8S 160T ",32 );
dtlong=655360;
break;
default:
strncpy ( Headdata,"DISKDUP MFM 2HD 1024B/S 8S 154T ",32 );
dtlong=1261568;
break;
}
}
/**********************************************************
[ヘッドデ-タからディスクタイプを得る]
用法 gethead();
引数 無し
戻り値 0: エラ-
1: 2HD 1.2M
2: 2DD 720K
3: 2DD 640K
**********************************************************/
int gethead ( void )
{
int disktypes;
disktypes=0;
if ( strncmp(Headdata, "DISKDUP MFM 2HD 1024B/S 8S 154T ",32 ) == 0 )
{
disktypes=1;
dtlong=1261568;
flagerr=1;
strcpy( str, " 2HD 1.2M " );
putmessage();
flagerr=0;
}
else
{
if ( strncmp(Headdata, "DISKDUP MFM 2DD 720B/S 9S 160T ",32 ) == 0 )
{
disktypes=2;
dtlong=737280;
flagerr=1;
strcpy( str, " 720K 2DD " );
putmessage();
flagerr=0;
}
else
{
if (strncmp(Headdata,"DISKDUP MFM 2DD 640B/S 8S 160T ",32 ) == 0 )
{
disktypes=3;
dtlong=655360;
flagerr=1;
strcpy( str, "640K 2DD " );
putmessage();
flagerr=0;
}
else
{
disktypes=-1;
}
}
}
return disktypes;
}
/* END OF FILE */